#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
//vector也称单端数组
//vector数据结构与数组非常类似，但数组是静态空间，vector可以动态扩展


//vector构造函数
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}


void test01()
{
	vector<int> v1;	//默认构造，无参构造
	for(int i=0; i<10; i++)
	{
		v1.push_back(i);	//在容器尾部插入元素
	}
	printVector(v1);

	//通过区间方式进行构造
	vector<int> v2(v1.begin(), v1.end());	//左闭右开
	printVector(v2);

	//n个elem方式构造
	vector<int> v3(10, 100);	//10个100
	printVector(v3);

	//拷贝构造
	vector<int> v4(v3);
	printVector(v4);
}

int main()
{
	test01();
	return 0;
}







//vector赋值操作
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it < v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v;
	for (int i = 1; i <= 10; i++)
	{
		v.push_back(i);
	}
	printVector(v);

	// = 赋值
	vector<int> v2;
	v2 = v;
	printVector(v2);

	// assign 赋值
	vector<int> v3;
	v3.assign(v.begin(), v.end());	//左闭右开
	printVector(v3);

	//n个elem
	vector<int> v4;
	v4.assign(10, 9);	//10个9
	printVector(v4);
}

int main()
{
	test01();
	return 0;
}






//vector容量和大小

empty();			//判断容器是否为空
capacity();			//容器的容量
size();				//返回容器中元素的个数
resize(int num);	//重新指定容器长度，补0或删尾
resize(int num, elem);	//重新指定容器长度，补elem或删尾


void printVector(vector<int>& v1)
{
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v1;
	for (int i = 1; i <= 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);


	if (v1.empty())	//.empty(),若为空，返回真，反之则假
	{
		cout << "v1为空。" << endl;
	}
	else
	{
		cout << "v1不为空。" << endl;
		cout << "v1的容量为: " << v1.capacity() << endl;
		//容量会自动进行动态扩展
		cout << "v1的大小为: " << v1.size() << endl;
	}

	//重新指定大小
	v1.resize(15, 12);
	printVector(v1);

}

int main()
{
	test01();
	return 0;
}





//vector插入和删除

.push_back(elem);	//尾部插入元素elem    push_back能接受const T&作为参数，还可以接受T&&(右值引用)作为参数

.emplace_back();    //尾部插入元素elem    emplace_back不仅支持const T&、T&&，还支持传入classT的构造函数的参数(用这个)

.pop_back();		//删除最后一个元素

.insert(const_iterator pos, ele);		迭代器指向位置pos插入元素ele

//迭代器指向位置pos插入count个元素ele
.insert(const_iterator pos,	int count, ele);

//删除迭代器指向指向的元素(不能用.end(),该处没有元素)
.erase(const_iterator pos);

//删除迭代器从start到end之间的元素(左闭右开）
.erase(const_iterator start, const_iterator end);

.clear();	//删除容器中所有元素




void printVector(vector<int> v1)
{
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v1;
	//尾插法
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);

	printVector(v1);

	//尾删
	v1.pop_back();
	printVector(v1);

	//插入	第一个参数是迭代器
	v1.insert(v1.begin(), 99);
	printVector(v1);

	v1.insert(v1.end(), 2, 88);
	printVector(v1);

	//删除	参数也是迭代器
	v1.erase(v1.begin());
	printVector(v1);



}

int main()
{
	test01();
	return 0;
}






//vector容器数据存取
//.at(int idx)	返回索引idx所指的数据
//operator[idx]	返回索引idx所指的数据
//.front();		返回容器中第一个数据元素
//.back();		返回容器中最后一个数据元素
void printVector(vector<int> v1)
{	
	//使用迭代器打印
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}

	//使用[]访问数组元素进行打印
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	//使用.at()访问数组元素进行打印
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1.at(i) << " ";
	}
	cout << endl;

	//获取第一个元素
	cout << "第一个元素为: " << v1.front() << endl;

	//获取最后一个元素
	cout << "最后一个元素为: " << v1.back() << endl;
}

int main()
{
	test01();
	return 0;
}



//vector容器合并
//方法一: 用insert方法
vector<string>vec1,vec2,vec3;
//...vec1,vec2赋值
vec3.insert(vec3.end(),vec1.begin(),vec1.end());
vec3.insert(vec3.end(),vec2.begin(),vec2.end());
//此方法获得的vec3相当于vec1+vec2


//方法二: 用merge函数
vector<string>vec1,vec2,vec3;
//... vec1,vec2赋值
sort(vec1.begin(),vec1.end());
sort(vec2.begin(),vec2.end());
vec3.resize(vec1.size()+vec2.size());   //预留空间
merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec3.begin());
//merge需注意: 包含头文件<algorithm>
//1、vec1,和vec2需要经过排序，merge只能合并排序后的集合，不然会报错。
//2、vec3需要指定好大小，不然会报错。





//vector容器，互换容器
void printVector(vector<int> v1)
{
	//使用迭代器打印
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//1.基本使用
void test01()
{
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	vector<int> v2;
	for (int i = 10; i > 0; i--)
	{
		v2.push_back(i);
	}
	printVector(v2);

	cout << "交换后: " << endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}

//2.实际用途
//巧用swap收缩内存空间
void test02()
{
	vector<int> v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}

	cout << "v的容量为: " << v.capacity() << endl;
	cout << "v的大小为: " << v.size() << endl;

	v.resize(3);	//重新指定大小
	cout << "v的容量为: " << v.capacity() << endl;	//容量不变
	cout << "v的大小为: " << v.size() << endl;

	//用swap收缩内存
	vector<int>(v).swap(v);	//vector<int>(v)是匿名对象，拷贝v的一个新对象，没有名字
	//会按照v的大小初始化容量和大小，交换后匿名对象自动回收
	cout << "v的容量为: " << v.capacity() << endl;	//容量不变
	cout << "v的大小为: " << v.size() << endl;
}

int main()
{
	//test01();
	test02();
	return 0;
}







//vector预留空间
//.reserve(int len);	//容器预留len个元素长度，预留位置不初始化，元素不可访问

void test01()
{
	vector<int> v;

	//利用reserve预留空间
	v.reserve(100000);
	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;		//统计重新开辟空间的次数
		}
	}
	cout << "num = " << num << endl;

}

int main()
{
	test01();
	return 0;
}



